const http = require('http'); // 引入模块
const path = require('path');
const fs = require('fs');
// 创建实例化的类
class App{
    constructor() {
        // 实例化服务器模块
        this.server = http.createServer();
        // 事件回调函数以对象的方式储存
        this.reqEvent = {}
        // 静态目录的判断
        this.staticDir = "/static";
        // 监听请求事件
        this.server.on('request' , (req , res)=>{
            // 根据请求发过来的路径，来调用对应的回调函数，所以解析我们的路径
            let pathObj = path.parse(req.url);
            // 判断请求发过来的路径在不在我们事件回调函数对象里，在就调用不在就404
            if (pathObj.dir in this.reqEvent) {
                req.pathObj = pathObj;
                // 有，就调用属性对应的函数
                this.reqEvent[pathObj.dir](req , res);
            }else if(pathObj.dir == this.staticDir){
                res.setHeader("content-type" , this.getContentType(pathObj.ext));
                let rs = fs.createReadStream('./static/' + pathObj.base);
                rs.pipe(res);
            }else{
                // 返回404页面
                // 设置响应头编码
                res.setHeader("content-type" , "text/html;charset=utf-8");
                // 设置响应页面内容
                res.end("<h1>404！！！页面找不到</h1>")
            }
        });
    }
    on(url , fun){
        // 设置属性
        this.reqEvent[url] = fun;
    }
    run(port , callback){
        // 监听端口号
        this.server.listen(port , callback);
    }

    getContentType(extName){
        switch(extName){
            case ".jpg":
                return "image/jpeg";
            case ".html":
                return "text/html;charset=utf-8";
            case ".js":
                return "text/javascript;charset=utf-8";
            case ".json":
                return "text/json;charset=utf-8";
            case ".gif":
                return "image/gif";
            case ".css":
                return"text/css";
        }
    }
}

module.exports = App;